/**
 * 请求参数替换关键字(注：不支持对Formdata的字段名称替换)
 */
export default class ReplaceKeys {
  constructor(replaceKeysCfg, isTest) {
    this.replaceKeysCfg = replaceKeysCfg
    this.isTest = isTest
  }
  /**
   * 是否包含需要被替换的字段
   * @param {*} dataStr
  */
  checkIncludeKeyword(dataStr) {
    const isSome = this.replaceKeysCfg.some(item => {
      const key = `"${Object.keys(item)[0]}":`
      return dataStr.includes(key)
    })

    return isSome
  }
  /**
   * 替换字段名称
   * @param {*} config 请求config
   * @returns
  */
  replaceKeyword(config) {
    const encryptField = config.params ? 'params' : 'data'
    let dataTmp = config[encryptField]
    const isFormData = dataTmp instanceof FormData

    if (!dataTmp || isFormData || !Object.keys(dataTmp).length) {
      // 不支持对formdata的字段名称替换
      return config
    }
    try {
      dataTmp = JSON.stringify(config[encryptField])
      if (!this.checkIncludeKeyword(dataTmp)) {
        return config
      }
    } catch (error) {
      console.error('替换特殊字段处理失败')
      console.warn(config[encryptField])
      return config
    }
    // 替换前的字段名称
    let srcK = ''
    // 替换后的字段名称
    let desk = ''
    const oldDataTmp = dataTmp
    if (this.isTest) {
      console.log('----------url----------')
      console.log(config.url)
    }

    this.replaceKeysCfg.forEach(item => {
      srcK = Object.keys(item)[0]
      if (dataTmp.includes(`"${srcK}":`)) {
        desk = item[srcK]
        dataTmp = dataTmp.replace(`"${srcK}":`, `"${desk}":`)
        if (this.isTest) {
          console.log(`----------特殊字段%c${srcK}%c替换为%c${desk}%c----------`, 'color:red', 'color:black', 'color:red', 'color:black')
        }
      }
    })
    if (this.isTest) {
      console.log('----------替换前数据----------')
      console.log(oldDataTmp)
      console.log('----------替换后数据----------')
      console.log(dataTmp)
    }
    config[encryptField] = JSON.parse(dataTmp)
    return config
  }
}

